home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / front.lha / front / m2c / Listing.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  4KB  |  197 lines

  1. #include "SYSTEM_.h"
  2.  
  3. #ifndef DEFINITION_IO
  4. #include "IO.h"
  5. #endif
  6.  
  7. #ifndef DEFINITION_Memory
  8. #include "Memory.h"
  9. #endif
  10.  
  11. #ifndef DEFINITION_Strings
  12. #include "Strings.h"
  13. #endif
  14.  
  15. #ifndef DEFINITION_Listing
  16. #include "Listing.h"
  17. #endif
  18.  
  19. IO_tFile Listing_SourceFile;
  20. IO_tFile Listing_ListFile;
  21. Listing_tListMode Listing_ListMode;
  22.  
  23. #define ColFlag    '^'
  24. #define LineFlag    '@'
  25. typedef struct S_1 *tErrPtr;
  26. typedef struct S_1 {
  27.     SHORTCARD code, class, C_0_line, column, infcl;
  28.     ADDRESS info;
  29.     tErrPtr next;
  30. } tErrElmt;
  31. static tErrPtr start, stop, last, read;
  32. static SHORTCARD SourceLine;
  33.  
  34.  
  35. void Listing_PutError
  36. # ifdef __STDC__
  37. (CARDINAL Code, CARDINAL Class, CARDINAL Line, CARDINAL Column, CARDINAL InfoClass, ADDRESS Info)
  38. # else
  39. (Code, Class, Line, Column, InfoClass, Info)
  40. CARDINAL Code, Class, Line, Column, InfoClass;
  41. ADDRESS Info;
  42. # endif
  43. {
  44.   tErrPtr err;
  45.  
  46.   err = (tErrPtr)Memory_Alloc((LONGINT)sizeof(tErrElmt));
  47.   if (Line == 0) {
  48.     Line = MAX_SHORTCARD;
  49.   }
  50.   {
  51.     register tErrElmt *W_1 = err;
  52.  
  53.     W_1->code = Code;
  54.     W_1->class = Class;
  55.     W_1->C_0_line = Line;
  56.     W_1->column = Column;
  57.     W_1->infcl = InfoClass;
  58.     W_1->info = Info;
  59.   }
  60.   if (start == NIL) {
  61.     start = err;
  62.     read = err;
  63.     stop = err;
  64.     err->next = NIL;
  65.     last = err;
  66.   } else if (Line < start->C_0_line || Line == start->C_0_line && Column < start->column) {
  67.     err->next = start;
  68.     start = err;
  69.     read = err;
  70.   } else {
  71.     if (Line > stop->C_0_line || Line == stop->C_0_line && Column >= stop->column) {
  72.       last = stop;
  73.       stop = err;
  74.     } else if (Line > last->C_0_line || Line == last->C_0_line && Column >= last->column) {
  75.     } else {
  76.       last = start;
  77.     }
  78.     while (last->next != NIL && (Line > last->next->C_0_line || Line == last->next->C_0_line && Column >= last->next->column)) {
  79.       last = last->next;
  80.     }
  81.     err->next = last->next;
  82.     last->next = err;
  83.     last = err;
  84.   }
  85. }
  86.  
  87. BOOLEAN Listing_HasError
  88. # ifdef __STDC__
  89. ()
  90. # else
  91. ()
  92. # endif
  93. {
  94.   Strings_tString Buf;
  95.  
  96.   if (start == NIL) {
  97.     if (Listing_ListMode == Listing_Listing) {
  98.       while (!IO_EndOfFile(Listing_SourceFile)) {
  99.         Strings_ReadL(Listing_SourceFile, &Buf);
  100.         Strings_WriteL(Listing_ListFile, &Buf);
  101.       }
  102.       IO_WriteC(Listing_ListFile, LineFlag);
  103.     }
  104.   }
  105.   return start != NIL;
  106. }
  107.  
  108. void Listing_GetError
  109. # ifdef __STDC__
  110. (CARDINAL *Code, CARDINAL *Class, CARDINAL *Line, CARDINAL *Column, CARDINAL *InfoClass, ADDRESS *Info)
  111. # else
  112. (Code, Class, Line, Column, InfoClass, Info)
  113. CARDINAL *Code, *Class, *Line, *Column, *InfoClass;
  114. ADDRESS *Info;
  115. # endif
  116. {
  117.   tErrPtr Next;
  118.   SHORTCARD col;
  119.   Strings_tString Buf;
  120.  
  121.   {
  122.     register tErrElmt *W_2 = start;
  123.  
  124.     *Code = W_2->code;
  125.     *Class = W_2->class;
  126.     *Line = W_2->C_0_line;
  127.     *Column = W_2->column;
  128.     *InfoClass = W_2->infcl;
  129.     *Info = W_2->info;
  130.     Next = W_2->next;
  131.   }
  132.   Memory_Free((LONGINT)sizeof(tErrElmt), (ADDRESS)start);
  133.   if (Listing_ListMode == Listing_Listing) {
  134.     if (read == start) {
  135.       for (;;) {
  136.         if (IO_EndOfFile(Listing_SourceFile)) {
  137.           goto EXIT_1;
  138.         }
  139.         if (SourceLine >= *Line) {
  140.           goto EXIT_1;
  141.         }
  142.         Strings_ReadL(Listing_SourceFile, &Buf);
  143.         Strings_WriteL(Listing_ListFile, &Buf);
  144.         INC(SourceLine);
  145.       } EXIT_1:;
  146.       IO_WriteC(Listing_ListFile, LineFlag);
  147.       col = 2;
  148.       while (read != NIL && read->C_0_line == *Line) {
  149.         while (col < read->column) {
  150.           IO_WriteC(Listing_ListFile, ' ');
  151.           INC(col);
  152.         }
  153.         if (col == read->column) {
  154.           IO_WriteC(Listing_ListFile, ColFlag);
  155.           INC(col);
  156.         }
  157.         read = read->next;
  158.       }
  159.       IO_WriteNl(Listing_ListFile);
  160.     }
  161.     IO_WriteC(Listing_ListFile, LineFlag);
  162.   }
  163.   if (last == start) {
  164.     last = Next;
  165.   }
  166.   if (stop == start) {
  167.     stop = Next;
  168.   }
  169.   start = Next;
  170.   if (*Line == MAX_SHORTCARD) {
  171.     *Line = 0;
  172.   }
  173. }
  174.  
  175. void BEGIN_Listing()
  176. {
  177.   static BOOLEAN has_been_called = FALSE;
  178.  
  179.   if (!has_been_called) {
  180.     has_been_called = TRUE;
  181.  
  182.     BEGIN_IO();
  183.     BEGIN_IO();
  184.     BEGIN_Memory();
  185.     BEGIN_Strings();
  186.  
  187.     start = NIL;
  188.     read = NIL;
  189.     stop = NIL;
  190.     last = NIL;
  191.     Listing_SourceFile = IO_StdInput;
  192.     Listing_ListFile = IO_StdError;
  193.     Listing_ListMode = Listing_NoListing;
  194.     SourceLine = 0;
  195.   }
  196. }
  197.